#include "script.h"

#include <string>
#include <ctime>

#pragma warning(disable : 4244 4305) // double <-> float conversions

std::string statusText;
DWORD statusTextDrawTicksMax;
bool statusTextGxtEntry;

bool showText = false;
bool typing = false;
bool keyDown = false;
std::string typeText = "";

bool get_key_pressed(int nVirtKey)
{
	return (GetAsyncKeyState(nVirtKey) & 0x8000) != 0;
}

void update_status_text()
{
	if (showText == true)
	{
		UI::SET_TEXT_FONT(0);
		UI::SET_TEXT_SCALE(0.55, 0.55);
		UI::SET_TEXT_COLOUR(255, 255, 255, 255);
		UI::SET_TEXT_WRAP(0.0, 1.0);
		UI::SET_TEXT_CENTRE(1);
		UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
		UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
		if (statusTextGxtEntry)
		{
			UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
		}
		else
		{
			UI::_SET_TEXT_ENTRY("STRING");
			UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
		}
		UI::_DRAW_TEXT(0.5, 0.5);
	}
}

void set_status_text(std::string str, DWORD time = 2500, bool isGxtEntry = false)
{
	statusText = str;
	statusTextDrawTicksMax = time;
	statusTextGxtEntry = isGxtEntry;
}

void update_text()
{
	set_status_text("Plate: " + typeText);
}

void update()
{
	Ped playerPed = PLAYER::PLAYER_PED_ID();
	Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
	update_status_text();

	if (GetAsyncKeyState(VK_OEM_PLUS) & 0x8000 && typing == false && (PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)))
	{
		showText = true;
		typing = true;
	}
	if (!(PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0)))
	{
		typing = false;
		showText = false;
		typeText = "";
	}

	if (typing == true)
	{
		if (GetAsyncKeyState('1') & 0x8000 && keyDown == false)
		{
			typeText += "1";
			keyDown = true;
		}
		if (GetAsyncKeyState('2') & 0x8000 && keyDown == false)
		{
			typeText += "2";
			keyDown = true;
		}
		if (GetAsyncKeyState('3') & 0x8000 && keyDown == false)
		{
			typeText += "3";
			keyDown = true;
		}
		if (GetAsyncKeyState('4') & 0x8000 && keyDown == false)
		{
			typeText += "4";
			keyDown = true;
		}
		if (GetAsyncKeyState('5') & 0x8000 && keyDown == false)
		{
			typeText += "5";
			keyDown = true;
		}
		if (GetAsyncKeyState('6') & 0x8000 && keyDown == false)
		{
			typeText += "6";
			keyDown = true;
		}
		if (GetAsyncKeyState('7') & 0x8000 && keyDown == false)
		{
			typeText += "7";
			keyDown = true;
		}
		if (GetAsyncKeyState('8') & 0x8000 && keyDown == false)
		{
			typeText += "8";
			keyDown = true;
		}
		if (GetAsyncKeyState('9') & 0x8000 && keyDown == false)
		{
			typeText += "9";
			keyDown = true;
		}
		if (GetAsyncKeyState('0') & 0x8000 && keyDown == false)
		{
			typeText += "0";
			keyDown = true;
		}
		if (GetAsyncKeyState('A') & 0x8000 && keyDown == false)
		{
			typeText += "A";
			keyDown = true;
		}
		if (GetAsyncKeyState('B') & 0x8000 && keyDown == false)
		{
			typeText += "B";
			keyDown = true;
		}
		if (GetAsyncKeyState('C') & 0x8000 && keyDown == false)
		{
			typeText += "C";
			keyDown = true;
		}
		if (GetAsyncKeyState('D') & 0x8000 && keyDown == false)
		{
			typeText += "D";
			keyDown = true;
		}
		if (GetAsyncKeyState('E') & 0x8000 && keyDown == false)
		{
			typeText += "E";
			keyDown = true;
		}
		if (GetAsyncKeyState('F') & 0x8000 && keyDown == false)
		{
			typeText += "F";
			keyDown = true;
		}
		if (GetAsyncKeyState('G') & 0x8000 && keyDown == false)
		{
			typeText += "G";
			keyDown = true;
		}
		if (GetAsyncKeyState('H') & 0x8000 && keyDown == false)
		{
			typeText += "H";
			keyDown = true;
		}
		if (GetAsyncKeyState('I') & 0x8000 && keyDown == false)
		{
			typeText += "I";
			keyDown = true;
		}
		if (GetAsyncKeyState('J') & 0x8000 && keyDown == false)
		{
			typeText += "J";
			keyDown = true;
		}
		if (GetAsyncKeyState('K') & 0x8000 && keyDown == false)
		{
			typeText += "K";
			keyDown = true;
		}
		if (GetAsyncKeyState('L') & 0x8000 && keyDown == false)
		{
			typeText += "L";
			keyDown = true;
		}
		if (GetAsyncKeyState('M') & 0x8000 && keyDown == false)
		{
			typeText += "M";
			keyDown = true;
		}
		if (GetAsyncKeyState('N') & 0x8000 && keyDown == false)
		{
			typeText += "N";
			keyDown = true;
		}
		if (GetAsyncKeyState('O') & 0x8000 && keyDown == false)
		{
			typeText += "O";
			keyDown = true;
		}
		if (GetAsyncKeyState('P') & 0x8000 && keyDown == false)
		{
			typeText += "P";
			keyDown = true;
		}
		if (GetAsyncKeyState('Q') & 0x8000 && keyDown == false)
		{
			typeText += "Q";
			keyDown = true;
		}
		if (GetAsyncKeyState('R') & 0x8000 && keyDown == false)
		{
			typeText += "R";
			keyDown = true;
		}
		if (GetAsyncKeyState('S') & 0x8000 && keyDown == false)
		{
			typeText += "S";
			keyDown = true;
		}
		if (GetAsyncKeyState('T') & 0x8000 && keyDown == false)
		{
			typeText += "T";
			keyDown = true;
		}
		if (GetAsyncKeyState('U') & 0x8000 && keyDown == false)
		{
			typeText += "U";
			keyDown = true;
		}
		if (GetAsyncKeyState('V') & 0x8000 && keyDown == false)
		{
			typeText += "V";
			keyDown = true;
		}
		if (GetAsyncKeyState('W') & 0x8000 && keyDown == false)
		{
			typeText += "W";
			keyDown = true;
		}
		if (GetAsyncKeyState('X') & 0x8000 && keyDown == false)
		{
			typeText += "X";
			keyDown = true;
		}
		if (GetAsyncKeyState('Y') & 0x8000 && keyDown == false)
		{
			typeText += "Y";
			keyDown = true;
		}
		if (GetAsyncKeyState('Z') & 0x8000 && keyDown == false)
		{
			typeText += "Z";
			keyDown = true;
		}
		if (GetAsyncKeyState(VK_BACK) & 0x8000 && keyDown == false)
		{
			typeText = typeText.substr(0, typeText.size() - 1);
			keyDown = true;
		}
		if (GetAsyncKeyState(VK_SPACE) & 0x8000 && keyDown == false)
		{
			typeText += " ";
			keyDown = true;
		}
		if (GetAsyncKeyState(VK_RETURN) & 0x8000 && keyDown == false)
		{
			typing = false;
			showText = false;
			VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(veh, (char *)typeText.c_str());
			keyDown = true;
			typeText = "";
		}
		if (!(GetAsyncKeyState('1') & 0x8000) &&
			!(GetAsyncKeyState('2') & 0x8000) &&
			!(GetAsyncKeyState('3') & 0x8000) &&
			!(GetAsyncKeyState('4') & 0x8000) &&
			!(GetAsyncKeyState('5') & 0x8000) &&
			!(GetAsyncKeyState('6') & 0x8000) &&
			!(GetAsyncKeyState('7') & 0x8000) &&
			!(GetAsyncKeyState('8') & 0x8000) &&
			!(GetAsyncKeyState('9') & 0x8000) &&
			!(GetAsyncKeyState('0') & 0x8000) &&
			!(GetAsyncKeyState('A') & 0x8000) &&
			!(GetAsyncKeyState('B') & 0x8000) &&
			!(GetAsyncKeyState('C') & 0x8000) &&
			!(GetAsyncKeyState('D') & 0x8000) &&
			!(GetAsyncKeyState('E') & 0x8000) &&
			!(GetAsyncKeyState('F') & 0x8000) &&
			!(GetAsyncKeyState('G') & 0x8000) &&
			!(GetAsyncKeyState('H') & 0x8000) &&
			!(GetAsyncKeyState('I') & 0x8000) &&
			!(GetAsyncKeyState('J') & 0x8000) &&
			!(GetAsyncKeyState('K') & 0x8000) &&
			!(GetAsyncKeyState('L') & 0x8000) &&
			!(GetAsyncKeyState('M') & 0x8000) &&
			!(GetAsyncKeyState('N') & 0x8000) &&
			!(GetAsyncKeyState('O') & 0x8000) &&
			!(GetAsyncKeyState('P') & 0x8000) &&
			!(GetAsyncKeyState('Q') & 0x8000) &&
			!(GetAsyncKeyState('R') & 0x8000) &&
			!(GetAsyncKeyState('S') & 0x8000) &&
			!(GetAsyncKeyState('T') & 0x8000) &&
			!(GetAsyncKeyState('U') & 0x8000) &&
			!(GetAsyncKeyState('V') & 0x8000) && 
			!(GetAsyncKeyState('W') & 0x8000) && 
			!(GetAsyncKeyState('X') & 0x8000) && 
			!(GetAsyncKeyState('Y') & 0x8000) && 
			!(GetAsyncKeyState('Z') & 0x8000) &&
			!(GetAsyncKeyState(VK_BACK) & 0x8000) &&
			!(GetAsyncKeyState(VK_SPACE) & 0x8000))
		{
			keyDown = false;
		}
	}
}

void main()
{
	while (true)
	{
		update();
		update_text();
		WAIT(0);
	}
}

void ScriptMain()
{
	srand(GetTickCount());
	main();
}